<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>
        Inheritance No.4 Parasitic Inheritance
    </title>
</head>
<body>
    寄生式继承
</body>
<script>
    // 4 寄生式继承
    //下面这个原型式继承的关键函数留着，同时寄生函数给你升升级
    function inheritObject(o){
        function F(){}  //声明个过渡函数 这句要是有问题我就没辙了
        F.prototype = o; //把过渡函数的原型 用对象赋值。注意参数o是个对象
        return new F(); //返回一个F的实例
    }

    //还是原来配方的father    
    var father={
        name : '爸爸',
        age : 12,   //爸爸28岁
        sex : '男',
        body : ['172','70'],
        hand : {
            'wristPower' : 123,
            'handPower' : 123
        },
        eat : function(){
            console.log('吃饭');
            return this.name;
        }
    }

    // 寄生式继承的关键来了，各位看官做好准备
    function createFather(obj){
        var o = new inheritObject(obj);//这里我纠结呢，这个new个实例化是什么鬼，不过先这样吧。
        o.smile = function(){
            console.log('笑')
            return this.name; //这里的this 是o哦
        }
        return o;
    }

    //好了，前戏结束了，来来，测试测试
   var XiaoMing = createFather(father); //DaMing 通过inheriObject作为中间class，直接产生了一个以father对象为原型的类实例
    console.log(XiaoMing.smile()); //笑 爸爸  拓展效果没毛病

    //就是相当于对本身的对象，进行了方法拓展，可以把createXXX中的拓展方法，看成是又把o增加了prototype的方法。

    var XiaoHong = createFather(father);
    //当然寄生式，大家可以把他当成是原型式的升级版本，然后拓展方法寄生在了原型上。当然原型式有得缺点肯定还有。。。
    /****************请注意，以下代码纯拷贝自demo5，连运行结果都没改，各位看官验证下是不是一样的**************************/

    /***************************下面是关于类式继承缺点的测试******************************************/
    //var XiaoHong = new Son();
    //先把小红小明打印出来看看
    console.log(XiaoHong);
    console.log(XiaoMing);

    XiaoHong.age = 18 //我要快快长大
    console.log(XiaoHong.age); //18
    console.log(XiaoMing.age); //28  

    XiaoHong.sex = '女' //人家是女孩子
    console.log(XiaoHong.sex); //女
    console.log(XiaoMing.sex); //男

    //强行加入一个数组，通过另一个实例push入数组
    console.log("-------数组对象操作修改法----------")
    console.log(XiaoMing.body); //[172,70]
    XiaoHong.body.push('C');
    console.log(XiaoMing.body);  //[172,70,C]
    XiaoHong.body.shift();
    console.log(XiaoMing.body);  //[70,C]

    //难道只有数组会影响？我们试试对象   
    console.log(XiaoMing.hand); //{wristPower : 123 ,handPower : 123}
    XiaoHong.hand.fingerPower = 12; //添加一个对象数据
    console.log(XiaoMing.hand);   //{wristPower : 123 ,handPower : 123, fingerPower :12}
    XiaoHong.hand.wristPower = 0;  //修改一个对象数据
    console.log(XiaoMing.hand);     //{wristPower : 0 ,handPower : 123, fingerPower :12}

    console.log("-------赋值修改法----------")
    // 那我赋值
    console.log(XiaoMing.body); //[70,C]
    XiaoHong.body=['60','B']; 
    console.log(XiaoHong.body); //[60,B]
    console.log(XiaoMing.body); //[70,C]

    console.log(XiaoMing.hand);    //{wristPower : 0 ,handPower : 123, fingerPower :12}
    XiaoHong.hand = {'wristPower' : 234 ,'handPower' : 234};
    console.log(XiaoHong.hand);   // {wristPower : 234 ,handPower : 234}
    console.log(XiaoMing.hand);    //{wristPower : 0 ,handPower : 123, fingerPower :12}    

    /**************************果然。。。这寄生式。。貌似没啥意思嘛，那期待后一种吧。。*****************/
</script>
</html>
  
